import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'
import { routes, layoutOut } from './routes' //
import store from '@/store'
import NProgress from 'nprogress' // 顶部进度条
import 'nprogress/nprogress.css' // 顶部进度条 style
NProgress.configure({ showSpinner: false }) // NProgress 加载条配置
import { getToken, removeToken } from '@/utils/cookie' // get token from cookie
import setting from '@/setting'

// 创建路由
const createRouterNew = () => createRouter({
  history: setting.routerMode === 'hash' ? createWebHashHistory() : createWebHistory(),
  routes: routes
})

const router = createRouterNew()
// 路由更新之前
router.beforeEach(async(to, from, next) => {
  // 开始加载进度条
  NProgress.start()

  // 设置页面title
  document.title = `${to.meta.name} - ${setting.sysTitle}`
  // 确定用户是否已登录 有token 还要有 用户信息
  const isLogin = getToken() && sessionStorage.getItem('userInfo')
  if (isLogin) { // 判断是否有token
    if (to.path === `/${setting.loginPage}`) {
      // 如果已登录，重定向到主页
      next({ path: `/${setting.indexPage}` })
      // 停止加载进度条
      NProgress.done()
    } else {
      // 确定用户是否已通过getInfo获得其权限集合
      const hasRoles = await store.state.user.rules.length > 0
      if (hasRoles) {
        // 重要提示：如果路由匹配不到，会进入404NotFound页面
        next()
      } else {
        // 获取用户权限信息 这里可以进行一些操作
        const { rules } = await store.dispatch('user/getInfo')
        if (!rules || !Array.isArray(rules)) {
          console.error('请注意rules为空 eg: [1,2,3]')
          // 清除cookie 否则页面刷新后 必须手动清除缓存
          removeToken()
          return
        }
        // 根据路由权限 生成可访问的路由
        const accessRoutes = await store.dispatch('permission/generateRoutes', rules)
        // 增加异步路由
        for (const v of accessRoutes) {
          router.addRoute(v)
        }
        // hack方法，以确保addRoute是完整的
        // 设置replace：true，导航不会留下历史记录
        next({ ...to, replace: true })
      }
    }
  } else {
    /* 没有 token*/
    if (layoutOut.some(it => it.path === to.path)) {
      // 主框架外 免权限直接进入
      next()
    } else {
      // 其他无权访问的页面将重定向到登录页面 ?redirect=${to.path}
      next(`/${setting.loginPage}`)
      // 停止加载进度条
      NProgress.done()
    }
  }
})
router.afterEach(() => {
  // 停止加载进度条
  NProgress.done()
})

// 重置路由
export function resetRouter() {
  const newRouter = createRouterNew()
  router.matcher = newRouter.matcher
}

export default router
